﻿Imports WiremetModel.Entities.OEM
Imports InputValidation
Imports InputValidation.GeneralRules
Imports InputValidation.GeneralRules.NumericInputRules
Imports System.ComponentModel


Public Class NormaGatunekTolerancjaSrednicyInputDialog

    Private _unitOfWork As UnitOfWork
    Private _inputValidator As InputValidator
    Private _tolerancjaSrednicyList As IEnumerable(Of NormaGatunekTolerancjaSrednicy)

    Private _normaGatunekTolerancjaSrednicy As NormaGatunekTolerancjaSrednicy
    Public Property NormaGatunekTolerancjaSrednicy() As NormaGatunekTolerancjaSrednicy
        Get
            Return _normaGatunekTolerancjaSrednicy
        End Get
        Set(ByVal value As NormaGatunekTolerancjaSrednicy)
            _normaGatunekTolerancjaSrednicy = value
        End Set
    End Property

    

    Public Sub New(ByVal tolerancjaSrednicyList As IEnumerable(Of NormaGatunekTolerancjaSrednicy))
        InitializeComponent()
        _unitOfWork = New UnitOfWork()
        _normaGatunekTolerancjaSrednicy = New NormaGatunekTolerancjaSrednicy()
        _inputValidator = New InputValidator()
        ClearErrorLabels()
        _tolerancjaSrednicyList = tolerancjaSrednicyList
    End Sub

    Public Sub New(ByVal tolerancjaSrednicyList As IEnumerable(Of NormaGatunekTolerancjaSrednicy), ByVal normaGatunekTolerancjaSrednicy As NormaGatunekTolerancjaSrednicy)
        Me.New(tolerancjaSrednicyList)

        tb_SrednicaMinimalna.Text = normaGatunekTolerancjaSrednicy.SrednicaMinimalna.ToString()
        tb_SrednicaMaksymalna.Text = normaGatunekTolerancjaSrednicy.SrednicaMaksymalna.ToString()
        tb_TolerancjaDolna.Text = normaGatunekTolerancjaSrednicy.TolerancjaDolna.ToString()
        tb_TolerancjaGorna.Text = normaGatunekTolerancjaSrednicy.TolerancjaGorna.ToString()

    End Sub

    Private Sub NormaGatunekTolerancjaSrednicyInputDialog_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles Me.FormClosed
        _unitOfWork.Dispose()
    End Sub

    Private Sub ClearErrorLabels()
        lbl_SrednicaMaksymalnaError.Text = String.Empty
        lbl_SrednicaMinimalnaError.Text = String.Empty
        lbl_TolerancjaDolnaError.Text = String.Empty
        lbl_TolerancjaGornaError.Text = String.Empty
    End Sub


#Region "Input validation"

    Private Sub tb_SrednicaMinimalna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_SrednicaMinimalna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        Dim numericPositiveInputValidatingSpecification As New NumericPositiveInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_SrednicaMinimalna, e, lbl_SrednicaMinimalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification))
    End Sub

    Private Sub tb_SrednicaMaksymalna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_SrednicaMaksymalna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        Dim numericPositiveInputValidatingSpecification As New NumericPositiveInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_SrednicaMinimalna, e, lbl_SrednicaMinimalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification))

        If Not e.Cancel Then
            Dim srednicaMaksymalnaValidatingSpecification As New SrednicaMaksymalnaValidatingSpecification(Decimal.Parse(tb_SrednicaMinimalna.Text.Trim()))
            _inputValidator.ValidateTextBox(tb_SrednicaMaksymalna, e, lbl_SrednicaMaksymalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification).And(srednicaMaksymalnaValidatingSpecification))
        End If
    End Sub

    Private Sub tb_TolerancjaDolna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_TolerancjaDolna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_TolerancjaDolna, e, lbl_TolerancjaDolnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification))
    End Sub

    Private Sub tb_TolerancjaGorna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_TolerancjaGorna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_TolerancjaDolna, e, lbl_TolerancjaDolnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification))

        If Not e.Cancel Then
            Dim tolerancjaGornaValidatingSpecification As New TolerancjaGornaValidatingSpecification(Decimal.Parse(tb_TolerancjaDolna.Text.Trim()))
            _inputValidator.ValidateTextBox(tb_TolerancjaGorna, e, lbl_TolerancjaGornaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(tolerancjaGornaValidatingSpecification))
        End If
    End Sub

    Private Sub tb_SrednicaMinimalna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_SrednicaMinimalna.Validated
        lbl_SrednicaMinimalnaError.Text = String.Empty
    End Sub

    Private Sub tb_SrednicaMaksymalna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_SrednicaMaksymalna.Validated
        lbl_SrednicaMaksymalnaError.Text = String.Empty
    End Sub

    Private Sub tb_TolerancjaDolna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_TolerancjaDolna.Validated
        lbl_TolerancjaDolnaError.Text = String.Empty
    End Sub

    Private Sub tb_TolerancjaGorna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_TolerancjaGorna.Validated
        lbl_TolerancjaGornaError.Text = String.Empty
    End Sub


    Private Function GetCollidingZakres(ByVal min As Decimal, ByVal max As Decimal) As NormaGatunekTolerancjaSrednicy
        Return _tolerancjaSrednicyList.FirstOrDefault(
            Function(x) (min >= x.SrednicaMinimalna AndAlso min < x.SrednicaMaksymalna) OrElse
                        (max > x.SrednicaMinimalna AndAlso max <= x.SrednicaMaksymalna))
    End Function

#End Region


    Private Sub btn_Zatwierdź_Click(sender As System.Object, e As System.EventArgs) Handles btn_Accept.Click
        Try
            If Not ValidateChildren() Then
                Throw New EntityDataInputException("Podane dane są nieprawidłowe." & vbNewLine &
                                                   "Popraw je i spróbuj ponownie.")
            End If

            Dim collidingTolerancjaSrednicy As NormaGatunekTolerancjaSrednicy = GetCollidingZakres(Decimal.Parse(tb_SrednicaMinimalna.Text.Trim()), Decimal.Parse(tb_SrednicaMaksymalna.Text.Trim()))
            If Not IsNothing(collidingTolerancjaSrednicy) Then
                Throw New EntityDataInputException("Podany zarkes koliduje z innym zakresem:" & vbNewLine &
                                                   "Średnica minimalna: " & collidingTolerancjaSrednicy.SrednicaMinimalna & vbNewLine &
                                                   "Średnica maksymalna: " & collidingTolerancjaSrednicy.SrednicaMaksymalna)

            End If

            Dim confirmationDialogResult As DialogResult = MessageBox.Show("Czy jesteś pewień?", "Uwaga!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
            If confirmationDialogResult = Windows.Forms.DialogResult.Yes Then

                With NormaGatunekTolerancjaSrednicy
                    .SrednicaMaksymalna = Decimal.Parse(tb_SrednicaMaksymalna.Text.Trim())
                    .SrednicaMinimalna = Decimal.Parse(tb_SrednicaMinimalna.Text.Trim())
                    .TolerancjaDolna = Decimal.Parse(tb_TolerancjaDolna.Text.Trim())
                    .TolerancjaGorna = Decimal.Parse(tb_TolerancjaGorna.Text.Trim())
                End With

                DialogResult = Windows.Forms.DialogResult.OK
            End If
        Catch ex As EntityDataInputException
            MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub btn_Anuluj_Click(sender As System.Object, e As System.EventArgs) Handles btn_Cancel.Click
        DialogResult = Windows.Forms.DialogResult.Cancel
    End Sub
End Class